package entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

/*
 * http://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags
 */


@Entity
@Table(name="aperturasMesas")
public class AperturaMesaEntity implements Serializable{
		
		@Transient
		private static final long serialVersionUID = 1L;
		
		@Id 
		@GeneratedValue
		private Integer id;
		private String estado;
//		@OneToMany
//		@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
//		@Fetch(value = FetchMode.SUBSELECT)
//		@JoinColumn(name="idAperturaMesa")
//		@ManyToMany(cascade=CascadeType.ALL)
		@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
		@Fetch(value = FetchMode.SUBSELECT)
		@JoinTable(name="aperturasMesasMesas")
		private List<MesaEntity> mesas = new ArrayList<MesaEntity>();
		@ManyToOne
		@JoinColumn(name="idMozo")
		private MozoEntity mozo;
		private Integer cantComensales;
//		@OneToMany
		@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
		@Fetch(value = FetchMode.SUBSELECT)
		@JoinColumn(name="idAperturaMesa")
		private List<PedidoEntity> pedidos = new ArrayList<PedidoEntity>();
		private Date fecha;
		
		
		public AperturaMesaEntity() {
//			mozo = new MozoEntity();
		}

		
		
		
		
		public List<MesaEntity> getMesas() {
			return mesas;
		}
		
		public void setMesas(List<MesaEntity> mesas) {
			this.mesas = mesas;
		}
		
		public void setMesa(MesaEntity mesa) {
			this.mesas.add(mesa);
		}
		public void removeMesa(MesaEntity mesa) {
			//chequear
			this.mesas.remove(mesa);
		}
		
		public MozoEntity getMozo() {
			return mozo;
		}

		public void setMozo(MozoEntity mozo) {
			this.mozo = mozo;
		}

		public Integer getCantComensales() {
			return cantComensales;
		}

		public void setCantComensales(Integer cantComensales) {
			this.cantComensales = cantComensales;
		}

		public List<PedidoEntity> getPedidos() {
			return pedidos;
		}

		public void setPedidos(List<PedidoEntity> pedidos) {
			this.pedidos = pedidos;
		}

		public Date getFecha() {
			return fecha;
		}

		public void setFecha(Date fecha) {
			this.fecha = fecha;
		}

		public Integer getId() {
			return id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public String getEstado() {
			return estado;
		}

		public void setEstado(String estado) {
			this.estado = estado;
		}

		@Override
		public String toString() {
			return "AperturaMesaEntity [id=" + id + ", estado=" + estado
					+ ", mesas=" + mesas + ", mozo=" + mozo
					+ ", cantComensales=" + cantComensales + ", pedidos="
					+ pedidos + ", fecha=" + fecha + "]";
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime
					* result
					+ ((cantComensales == null) ? 0 : cantComensales.hashCode());
			result = prime * result
					+ ((estado == null) ? 0 : estado.hashCode());
			result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
			result = prime * result + ((id == null) ? 0 : id.hashCode());
			result = prime * result + ((mesas == null) ? 0 : mesas.hashCode());
			result = prime * result + ((mozo == null) ? 0 : mozo.hashCode());
			result = prime * result
					+ ((pedidos == null) ? 0 : pedidos.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			AperturaMesaEntity other = (AperturaMesaEntity) obj;
			if (cantComensales == null) {
				if (other.cantComensales != null)
					return false;
			} else if (!cantComensales.equals(other.cantComensales))
				return false;
			if (estado == null) {
				if (other.estado != null)
					return false;
			} else if (!estado.equals(other.estado))
				return false;
			if (fecha == null) {
				if (other.fecha != null)
					return false;
			} else if (!fecha.equals(other.fecha))
				return false;
			if (id == null) {
				if (other.id != null)
					return false;
			} else if (!id.equals(other.id))
				return false;
			if (mesas == null) {
				if (other.mesas != null)
					return false;
			} else if (!mesas.equals(other.mesas))
				return false;
			if (mozo == null) {
				if (other.mozo != null)
					return false;
			} else if (!mozo.equals(other.mozo))
				return false;
			if (pedidos == null) {
				if (other.pedidos != null)
					return false;
			} else if (!pedidos.equals(other.pedidos))
				return false;
			return true;
		}
}
